<?php

defined('EN_CODE') or die(__FILE__.': Direct Access Denied');
define('BUNDLE', 'clientes');

// instanciar el paginador con la cantidad de items por pagina
use Code\Paginador;
$paginador = new Paginador(2);
// traer el modelo del modulo
$helper->include_model('clientes');

// titulo y slug de la pagina
$title = 'Clientes';
$slug = 'clientes';

$listado = false;
if (isset($parameters[2])) switch ($parameters[2]) {

  /**
    
    nuevo

  */
  case 'nuevo':
    $content .= $helper->include_template(BUNDLE.'/formulario', array('action'=>'new', 'key'=>SHA1('new'.CSRF_TOKEN)));
    break;

  /**
    
    procesar formulario

  */
  case 'guardar':
    $action = ($request->request->get('action'));
    $key = ($request->request->get('key'));
    $guardar = false;
    $eliminar_cliente = false;
    if (is_null($action) || is_null($key)) {
      $listado = true;
      break(1);
    }
    if ($request->request->get('key')!=(SHA1($request->request->get('action').CSRF_TOKEN))) {
      $content = $helper->include_template('error/server_error', array('message'=>'Se detectó un ataque CSRF!! Dejá de joder y leete un libro...'));
      break(2);
    }
    /**
      si viene nuevo
    */
    if ($action=='new') {
      $cliente = un_cliente_con(array('dni'=>$request->request->getDigits('dni')));
      if ($cliente) {
        $message = 'Ya existe un cliente con ese dni!!';
        $message_type = 'error';
        $listado = true;
        break(1);
      } else {
        $guardar = true;
      }
    /**
      si viene de editar
    */
    } else if ($action=='edit') {
      $cliente = un_cliente_con(array('dni'=>($request->request->get('numero_cliente'))));
      if (!$cliente) {
        $message = 'El cliente que intenta editar no existe!!';
        $message_type = 'error';
        $listado = true;
        break(1);
      }
      $otro_cliente = un_cliente_con(array(
        'dni'=>$request->request->get('dni')));
      if ($otro_cliente && $otro_cliente['numero_cliente']!=$request->request->get('numero_cliente')) {
        $message = 'Ya existe un cliente con ese dni!!';
        $message_type = 'error';
      } else if (($cliente['dni']!=$request->request->get('dni'))
          || $cliente['nombre']!=$request->request->get('nombre')
          || $cliente['apellido']!=$request->request->get('apellido')
          || $cliente['telefono']!=$request->request->get('telefono')
          || $cliente['email']!=$request->request->get('email')
          || $cliente['username']!=$request->request->get('username')
          || $cliente['password']!='') {
        $guardar = true;
      }
    }
    /**
      tiene que guardar los cambios (validacion)
    */
    if ($guardar) {
      // valida el dni
      $dni = trim($request->request->get('dni'));
      if (empty($dni)) {
        $message = 'Envió un dni vacío';
        $message_type = 'error';
        $listado = true;
        break;
      }
      // valida el nombre
      $nombre = trim($request->request->get('nombre'));
      if (empty($nombre)) {
        $message = 'Envió un nombre vacío';
        $message_type = 'error';
        $listado = true;
        break;
      }
       // valida el apellido
      $apellido = trim($request->request->get('apellido'));
      if (empty($apellido)) {
        $message = 'Envió un apellido vacío';
        $message_type = 'error';
        $listado = true;
        break;
      }
       // valida el username
      $username = trim($request->request->get('username'));
      if (empty($username)) {
        $message = 'Envió un nombre de usuario vacío';
        $message_type = 'error';
        $listado = true;
        break;
      }
     /**
        guarda el nuevo cliente
      */
      $datos_cliente = array(
        'dni'       => $dni,
        'nombre'    => $nombre,
        'apellido'  => $apellido,
        'telefono'  => $request->request->get('telefono'),
        'email'     => $request->request->get('email'),
        'username'   => $request->request->get('username')
      );
      if ($action=='new' || ($request->request->get('password')!='')) {
        $datos_cliente['password'] = SHA1($request->request->get('password'));
      }
      $numero_cliente = upsert_cliente($datos_cliente, $request->request->get('numero_cliente', null));
      if (!$numero_cliente) {
        $message = 'Se produjo un error al guardar el cliente';
        $message_type = 'error';
      } else {
        $message = 'Se guardaron los cambios correctamente';
        $message_type = 'info';
        $cliente = un_cliente($numero_cliente);
      }
    }
    /**
      
      editar

    */
  case 'editar':
      if ((!$request->query->has('cliente')) && (!isset($cliente))) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ningún cliente'));
      $response->setStatusCode(412);
      break(1);
    }
    if ($request->query->has('cliente')) {
      $cliente = un_cliente($request->query->get('cliente'));
    }
    if (!$cliente) {
      $content = $helper->include_template('error/server_error', array('message'=>'El cliente seleccionado no existe'));
      $response->setStatusCode(412);
      break(1);
    }
     $content .= $helper->include_template(BUNDLE.'/formulario', array('cliente'=>$cliente, 'action'=>'edit', 'key'=>SHA1('edit'.CSRF_TOKEN)));
    
    break;
    /**

      eliminar

    */
  case 'eliminar':
    if (!$request->query->has('cliente')) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ningun cliente'));
      $response->setStatusCode(412);
    } else if ((!$request->query->has('token')) || ($request->query->get('token')!=(SHA1($request->query->get('cliente').CSRF_TOKEN)))) {
      $content = $helper->include_template('error/server_error', array('message'=>'Se detectó un ataque CSRF!! Dejá de joder y leete un libro...'));
    } else {
      $cliente = un_cliente($request->query->get('cliente'));
      if ($cliente) {
        $helper->include_model('ventas');
        if (!una_venta_con(array('numero_cliente'=>$cliente['numero_cliente']))) {
          if (eliminar_cliente($cliente['numero_cliente'])) {
            $message = "Se elimino el cliente correctamente";
            $message_type = 'info';
          } else {
            $message = "Se produjo un error al eliminar el cliente";
            $message_type = 'error';
          }
        } else {
            $message = "No se puede eliminar el cliente porque tiene ventas asociadas";
            $message_type = 'error';
        }
      }
      $listado = true;
    }
    break;

      /**

        buscar

      */
    case 'buscar':
      $hay_consultas = false; // para saber si usar WHERE o AND en el armado de la consulta
      $filtros = array(); // para determinar los filtros que se van a aplicar en la consulta
      /**
        numero_cliente
      */
      $query_numero_cliente = '';
      if ($request->query->has('numero_cliente')) {
        $numero_cliente = trim($request->query->get('numero_cliente'));
        if ($numero_cliente!='') {
          $query_numero_cliente = " WHERE numero_cliente LIKE '%". $request->query->get('numero_cliente') ."%' ";
          $hay_consultas = true;
          $filtros['número de cliente similar a '] = $request->query->get('numero_cliente');
        }
      }
      /**
        dni
      */
      $query_dni = '';
      if ($request->query->has('dni')) {
        $dni = trim($request->query->get('dni'));
        if ($dni!='') {
          $join = ($hay_consultas ? "AND" : "WHERE");
          $query_dni = " $join dni LIKE '%". $request->query->get('dni') ."%' ";
          $hay_consultas = true;
          $filtros['DNI similar a '] = $request->query->get('dni');
        }
      }
      /**
        nombre
      */
      $query_nombre = '';
      if ($request->query->has('nombre')) {
        $nombre = trim($request->query->get('nombre'));
        if ($nombre!='') {
          $join = ($hay_consultas ? "AND" : "WHERE");
          $query_nombre = " $join nombre LIKE '%". $request->query->get('nombre') ."%' ";
          $hay_consultas = true;
          $filtros['nombre similar a '] = $request->query->get('nombre');
        }
      }
      /**
        apellido
      */
      $query_apellido = '';
      if ($request->query->has('apellido')) {
        $apellido = trim($request->query->get('apellido'));
        if ($apellido!='') {
          $join = ($hay_consultas ? "AND" : "WHERE");
          $query_apellido = " $join apellido LIKE '%". $request->query->get('apellido') ."%' ";
          $hay_consultas = true;
          $filtros['apellido similar a '] = $request->query->get('apellido');
        }
      }
      /**
        telefono
      */
      $query_telefono = '';
      if ($request->query->has('telefono')) {
        $telefono = trim($request->query->get('telefono'));
        if ($telefono!='') {
          $join = ($hay_consultas ? "AND" : "WHERE");
          $query_telefono = " $join telefono LIKE '%". $request->query->get('telefono') ."%' ";
          $hay_consultas = true;
          $filtros['teléfono similar a '] = $request->query->get('telefono');
        }
      }
      /**
        email
      */
      $query_email = '';
      if ($request->query->has('email')) {
        $email = trim($request->query->get('email'));
        if ($email!='') {
          $join = ($hay_consultas ? "AND" : "WHERE");
          $query_email = " $join email LIKE '%". $request->query->get('email') ."%' ";
          $hay_consultas = true;
          $filtros['email similar a '] = $request->query->get('email');
        }
      }
      /**
        username
      */
      $query_username = '';
      if ($request->query->has('username')) {
        $username = trim($request->query->get('username'));
        if ($username!='') {
          $join = ($hay_consultas ? "AND" : "WHERE");
          $query_username = " $join username LIKE '%". $request->query->get('username') ."%' ";
          $hay_consultas = true;
          $filtros['nombre de usuario similar a '] = $request->query->get('username');
        }
      }
      /**
        armar la consulta y traer el listado
      */
      $listado = true;
      // se fija el orden
      $order_by = '';
      if ($request->query->has('orden_c')) {
        $order_by = " ORDER BY ". $request->query->get('orden_c') ." ";
        if ($request->query->has('orden_t')) {
          $order_by .= " ". $request->query->get('orden_t') ." ";
        }
      }
      $query = "SELECT * FROM clientes $query_numero_cliente $query_dni $query_nombre $query_apellido $query_telefono $query_email $query_username $order_by";
      $query = $paginador->query($query, $request->query->get('pagina', 1  ));
      $result = $model->query($query);
      if (!$result || $model->numRows($result)==0) {
        $message = 'La búsqueda no produjo ningún resultado';
        $message_type = 'error';
      } else {
        $filtrado = "Filtrando por ";
        $i = 0; // para saber si separa con coma
        foreach ($filtros as $filtro => $valor) {
          $filtrado .= "$filtro'$valor'";
          $filtrado .= ((++$i==count($filtros)) ?'': ", " );
        }
        $listado_clientes = $model->fetchAll($result);
      }
      break;

    default:
    $listado = true;
} else {
  $listado = true;
}

/**
  listado
*/

// listado esta aca por ser la pagina por default
if ($listado) {

  // va a buscar el listado de clientes
  if (!isset($listado_clientes)) {
    // se fija el orden
    $order_by = '';
    if ($request->query->has('orden_c')) {
      $order_by = " ORDER BY ". $request->query->get('orden_c') ." ";
      if ($request->query->has('orden_t')) {
        $order_by .= " ". $request->query->get('orden_t') ." ";
      }
    }
    $query = "SELECT * FROM clientes $order_by";
    $query = $paginador->query($query, $request->query->get('pagina', 1));
    $result = $model->query($query);
    $listado_clientes = $model->fetchAll($result);
  }

  // arma el array orden_t (asc o desc)
  $orden_t = $helper->get_order_links(array('numero_cliente', 'dni', 'nombre', 'apellido', 'telefono', 'email', 'username'), $request->query->get('orden_c', null), $request->query->get('orden_t', null));
  // arma la URI para el paginador
  $uri_paginador = $helper->build_uri(array('pagina'));
  // arma la URI para el orden
  $uri_orden = $helper->build_uri(array('orden_c', 'orden_t'));

  // muestra el template
  $content .= $helper->include_template(BUNDLE.'/listado',
                                        array(
                                          'clientes'=>$listado_clientes,
                                          'uri_orden'=>$uri_orden,
                                          'orden_t'=>$orden_t,
                                          'uri_paginador'=>$uri_paginador,
                                          'paginador'=>$paginador,
                                          'filtrado'=>(isset($filtrado) ? $filtrado : '')));
}

?>
